#ifndef __OV2640_H__
#define __OV2640_H__

#define OV_MID				0X7FA2
#define OV_PID				0X2642

// 0XFF = 0X00
#define OV_DSP_R_BYPASS     0x05
#define OV_DSP_Qs           0x44
#define OV_DSP_CTRL         0x50
#define OV_DSP_HSIZE1       0x51
#define OV_DSP_VSIZE1       0x52
#define OV_DSP_XOFFL        0x53
#define OV_DSP_YOFFL        0x54
#define OV_DSP_VHYX         0x55
#define OV_DSP_DPRP         0x56
#define OV_DSP_TEST         0x57
#define OV_DSP_ZMOW         0x5A
#define OV_DSP_ZMOH         0x5B
#define OV_DSP_ZMHH         0x5C
#define OV_DSP_BPADDR       0x7C
#define OV_DSP_BPDATA       0x7D
#define OV_DSP_CTRL2        0x86
#define OV_DSP_CTRL3        0x87
#define OV_DSP_SIZEL        0x8C
#define OV_DSP_HSIZE2       0xC0
#define OV_DSP_VSIZE2       0xC1
#define OV_DSP_CTRL0        0xC2
#define OV_DSP_CTRL1        0xC3
#define OV_DSP_R_DVP_SP     0xD3
#define OV_DSP_IMAGE_MODE   0xDA
#define OV_DSP_RESET        0xE0
#define OV_DSP_MS_SP        0xF0
#define OV_DSP_SS_ID        0x7F
#define OV_DSP_SS_CTRL      0xF8
#define OV_DSP_MC_BIST      0xF9
#define OV_DSP_MC_AL        0xFA
#define OV_DSP_MC_AH        0xFB
#define OV_DSP_MC_D         0xFC
#define OV_DSP_P_STATUS     0xFE
#define OV_DSP_RA_DLMT      0xFF

// 0XFF = 0X01
#define OV_SEN_GAIN       0x00
#define OV_SEN_COM1       0x03
#define OV_SEN_REG04      0x04
#define OV_SEN_REG08      0x08
#define OV_SEN_COM2       0x09
#define OV_SEN_PIDH       0x0A
#define OV_SEN_PIDL       0x0B
#define OV_SEN_COM3       0x0C
#define OV_SEN_COM4       0x0D
#define OV_SEN_AEC        0x10
#define OV_SEN_CLKRC      0x11
#define OV_SEN_COM7       0x12
#define OV_SEN_COM8       0x13
#define OV_SEN_COM9       0x14
#define OV_SEN_COM10      0x15
#define OV_SEN_HREFST     0x17
#define OV_SEN_HREFEND    0x18
#define OV_SEN_VSTART     0x19
#define OV_SEN_VEND       0x1A
#define OV_SEN_MIDH       0x1C
#define OV_SEN_MIDL       0x1D
#define OV_SEN_AEW        0x24
#define OV_SEN_AEB        0x25
#define OV_SEN_W          0x26
#define OV_SEN_REG2A      0x2A
#define OV_SEN_FRARL      0x2B
#define OV_SEN_ADDVSL     0x2D
#define OV_SEN_ADDVHS     0x2E
#define OV_SEN_YAVG       0x2F
#define OV_SEN_REG32      0x32
#define OV_SEN_ARCOM2     0x34
#define OV_SEN_REG45      0x45
#define OV_SEN_FLL        0x46
#define OV_SEN_FLH        0x47
#define OV_SEN_COM19      0x48
#define OV_SEN_ZOOMS      0x49
#define OV_SEN_COM22      0x4B
#define OV_SEN_COM25      0x4E
#define OV_SEN_BD50       0x4F
#define OV_SEN_BD60       0x50
#define OV_SEN_REG5D      0x5D
#define OV_SEN_REG5E      0x5E
#define OV_SEN_REG5F      0x5F
#define OV_SEN_REG60      0x60
#define OV_SEN_HISTO_LOW  0x61
#define OV_SEN_HISTO_HIGH 0x62

// SXGA 1600x1200, 15 fps
const static uint8_t ov_sxga_init_tbl[][2]= {
    {0xff, 0x00},
    {0x2c, 0xff},
    {0x2e, 0xdf},
    {0xff, 0x01},
    {0x3c, 0x32},
    //
    {0x11, 0x00},
    {0x09, 0x02},
    {0x04, 0xD8}, // v, h flip
    {0x13, 0xe5},
    {0x14, 0x48},
    {0x2c, 0x0c},
    {0x33, 0x78},
    {0x3a, 0x33},
    {0x3b, 0xfB},
    //
    {0x3e, 0x00},
    {0x43, 0x11},
    {0x16, 0x10},
    //
    {0x39, 0x92},
    //
    {0x35, 0xda},
    {0x22, 0x1a},
    {0x37, 0xc3},
    {0x23, 0x00},
    {0x34, 0xc0},
    {0x36, 0x1a},
    {0x06, 0x88},
    {0x07, 0xc0},
    {0x0d, 0x87},
    {0x0e, 0x41},
    {0x4c, 0x00},

    {0x48, 0x00},
    {0x5B, 0x00},
    {0x42, 0x03},
    //
    {0x4a, 0x81},
    {0x21, 0x99},
    //
    {0x24, 0x40},
    {0x25, 0x38},
    {0x26, 0x82},
    {0x5c, 0x00},
    {0x63, 0x00},
    {0x46, 0x00},
    {0x0c, 0x3c},
    //
    {0x61, 0x70},
    {0x62, 0x80},
    {0x7c, 0x05},
    //
    {0x20, 0x80},
    {0x28, 0x30},
    {0x6c, 0x00},
    {0x6d, 0x80},
    {0x6e, 0x00},
    {0x70, 0x02},
    {0x71, 0x94},
    {0x73, 0xc1},
    {0x3d, 0x34},
    {0x5a, 0x57},
    //
    {0x12, 0x00}, // UXGA 1600*1200

    {0x17, 0x11},
    {0x18, 0x75},
    {0x19, 0x01},
    {0x1a, 0x97},
    {0x32, 0x36},
    {0x03, 0x0f},
    {0x37, 0x40},
    //
    {0x4f, 0xca},
    {0x50, 0xa8},
    {0x5a, 0x23},
    {0x6d, 0x00},
    {0x6d, 0x38},
    //
    {0xff, 0x00},
    {0xe5, 0x7f},
    {0xf9, 0xc0},
    {0x41, 0x24},
    {0xe0, 0x14},
    {0x76, 0xff},
    {0x33, 0xa0},
    {0x42, 0x20},
    {0x43, 0x18},
    {0x4c, 0x00},
    {0x87, 0xd5},
    {0x88, 0x3f},
    {0xd7, 0x03},
    {0xd9, 0x10},
    {0xd3, 0x82},
    //
    {0xc8, 0x08},
    {0xc9, 0x80},
    //
    {0x7c, 0x00},
    {0x7d, 0x00},
    {0x7c, 0x03},
    {0x7d, 0x48},
    {0x7d, 0x48},
    {0x7c, 0x08},
    {0x7d, 0x20},
    {0x7d, 0x10},
    {0x7d, 0x0e},
    //
    {0x90, 0x00},
    {0x91, 0x0e},
    {0x91, 0x1a},
    {0x91, 0x31},
    {0x91, 0x5a},
    {0x91, 0x69},
    {0x91, 0x75},
    {0x91, 0x7e},
    {0x91, 0x88},
    {0x91, 0x8f},
    {0x91, 0x96},
    {0x91, 0xa3},
    {0x91, 0xaf},
    {0x91, 0xc4},
    {0x91, 0xd7},
    {0x91, 0xe8},
    {0x91, 0x20},
    //
    {0x92, 0x00},
    {0x93, 0x06},
    {0x93, 0xe3},
    {0x93, 0x05},
    {0x93, 0x05},
    {0x93, 0x00},
    {0x93, 0x04},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    //
    {0x96, 0x00},
    {0x97, 0x08},
    {0x97, 0x19},
    {0x97, 0x02},
    {0x97, 0x0c},
    {0x97, 0x24},
    {0x97, 0x30},
    {0x97, 0x28},
    {0x97, 0x26},
    {0x97, 0x02},
    {0x97, 0x98},
    {0x97, 0x80},
    {0x97, 0x00},
    {0x97, 0x00},
    //
    {0xc3, 0xef},

    {0xa4, 0x00},
    {0xa8, 0x00},
    {0xc5, 0x11},
    {0xc6, 0x51},
    {0xbf, 0x80},
    {0xc7, 0x10},
    {0xb6, 0x66},
    {0xb8, 0xA5},
    {0xb7, 0x64},
    {0xb9, 0x7C},
    {0xb3, 0xaf},
    {0xb4, 0x97},
    {0xb5, 0xFF},
    {0xb0, 0xC5},
    {0xb1, 0x94},
    {0xb2, 0x0f},
    {0xc4, 0x5c},
    //
    {0xc0, 0xc8},
    {0xc1, 0x96},
    {0x8c, 0x00},
    {0x86, 0x3d},
    {0x50, 0x00},
    {0x51, 0x90},
    {0x52, 0x2c},
    {0x53, 0x00},
    {0x54, 0x00},
    {0x55, 0x88},

    {0x5a, 0x90},
    {0x5b, 0x2C},
    {0x5c, 0x05},

    {0xd3, 0x02}, // auto
    //
    {0xc3, 0xed},
    {0x7f, 0x00},

    {0xda, 0x09},

    {0xe5, 0x1f},
    {0xe1, 0x67},
    {0xe0, 0x00},
    {0xdd, 0x7f},
    {0x05, 0x00},
};

// SVGA 800*600, 30 fps
const static uint8_t ov_svga_init_tbl[][2]= {
    {0xff, 0x00},
    {0x2c, 0xff},
    {0x2e, 0xdf},
    {0xff, 0x01},
    {0x3c, 0x32},
    //
    {0x11, 0x00},
    {0x09, 0x02},
    {0x04, 0x88}, // v, h flip
    {0x13, 0xe5},
    {0x14, 0x48},
    {0x2c, 0x0c},
    {0x33, 0x78},
    {0x3a, 0x33},
    {0x3b, 0xfB},
    //
    {0x3e, 0x00},
    {0x43, 0x11},
    {0x16, 0x10},
    //
    {0x39, 0x92},
    //
    {0x35, 0xda},
    {0x22, 0x1a},
    {0x37, 0xc3},
    {0x23, 0x00},
    {0x34, 0xc0},
    {0x36, 0x1a},
    {0x06, 0x88},
    {0x07, 0xc0},
    {0x0d, 0x87},
    {0x0e, 0x41},
    {0x4c, 0x00},
    {0x48, 0x00},
    {0x5B, 0x00},
    {0x42, 0x03},
    //
    {0x4a, 0x81},
    {0x21, 0x99},
    //
    {0x24, 0x40},
    {0x25, 0x38},
    {0x26, 0x82},
    {0x5c, 0x00},
    {0x63, 0x00},
    {0x46, 0x00}, // 0x22
    {0x0c, 0x3c},
    //
    {0x61, 0x70},
    {0x62, 0x80},
    {0x7c, 0x05},
    //
    {0x20, 0x80},
    {0x28, 0x30},
    {0x6c, 0x00},
    {0x6d, 0x80},
    {0x6e, 0x00},
    {0x70, 0x02},
    {0x71, 0x94},
    {0x73, 0xc1},

    {0x3d, 0x34},
    {0x5a, 0x57},
    //
    {0x12, 0x40},//SVGA 800*600
    {0x17, 0x11},
    {0x18, 0x43},
    {0x19, 0x00},
    {0x1a, 0x4b},
    {0x32, 0x09},
    {0x37, 0xc0},
    //
    {0x4f, 0xca},
    {0x50, 0xa8},
    {0x5a, 0x23},
    {0x6d, 0x00},
    {0x3d, 0x38},
    //
    {0xff, 0x00},
    {0xe5, 0x7f},
    {0xf9, 0xc0},
    {0x41, 0x24},
    {0xe0, 0x14},
    {0x76, 0xff},
    {0x33, 0xa0},
    {0x42, 0x20},
    {0x43, 0x18},
    {0x4c, 0x00},
    {0x87, 0xd5},
    {0x88, 0x3f},
    {0xd7, 0x03},
    {0xd9, 0x10},
    {0xd3, 0x82},
    //
    {0xc8, 0x08},
    {0xc9, 0x80},
    //
    {0x7c, 0x00},
    {0x7d, 0x00},
    {0x7c, 0x03},
    {0x7d, 0x48},
    {0x7d, 0x48},
    {0x7c, 0x08},
    {0x7d, 0x20},
    {0x7d, 0x10},
    {0x7d, 0x0e},
    //
    {0x90, 0x00},
    {0x91, 0x0e},
    {0x91, 0x1a},
    {0x91, 0x31},
    {0x91, 0x5a},
    {0x91, 0x69},
    {0x91, 0x75},
    {0x91, 0x7e},
    {0x91, 0x88},
    {0x91, 0x8f},
    {0x91, 0x96},
    {0x91, 0xa3},
    {0x91, 0xaf},
    {0x91, 0xc4},
    {0x91, 0xd7},
    {0x91, 0xe8},
    {0x91, 0x20},
    //
    {0x92, 0x00},
    {0x93, 0x06},
    {0x93, 0xe3},
    {0x93, 0x05},
    {0x93, 0x05},
    {0x93, 0x00},
    {0x93, 0x04},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    {0x93, 0x00},
    //
    {0x96, 0x00},
    {0x97, 0x08},
    {0x97, 0x19},
    {0x97, 0x02},
    {0x97, 0x0c},
    {0x97, 0x24},
    {0x97, 0x30},
    {0x97, 0x28},
    {0x97, 0x26},
    {0x97, 0x02},
    {0x97, 0x98},
    {0x97, 0x80},
    {0x97, 0x00},
    {0x97, 0x00},
    //
    {0xc3, 0xed},
    {0xa4, 0x00},
    {0xa8, 0x00},
    {0xc5, 0x11},
    {0xc6, 0x51},
    {0xbf, 0x80},
    {0xc7, 0x10},
    {0xb6, 0x66},
    {0xb8, 0xA5},
    {0xb7, 0x64},
    {0xb9, 0x7C},
    {0xb3, 0xaf},
    {0xb4, 0x97},
    {0xb5, 0xFF},
    {0xb0, 0xC5},
    {0xb1, 0x94},
    {0xb2, 0x0f},
    {0xc4, 0x5c},
    //
    {0xc0, 0x64},
    {0xc1, 0x4B},
    {0x8c, 0x00},
    {0x86, 0x3D},
    {0x50, 0x00},
    {0x51, 0xC8},
    {0x52, 0x96},
    {0x53, 0x00},
    {0x54, 0x00},
    {0x55, 0x00},
    {0x5a, 0xC8},
    {0x5b, 0x96},
    {0x5c, 0x00},

    {0xd3, 0x02}, // auto
    //
    {0xc3, 0xed},
    {0x7f, 0x00},

    {0xda, 0x09},

    {0xe5, 0x1f},
    {0xe1, 0x67},
    {0xe0, 0x00},
    {0xdd, 0x7f},
    {0x05, 0x00},
};

const static uint8_t ov_jpeg_tbl[][2]= {
    {0xff, 0x01},
    {0xe0, 0x14},
    {0xe1, 0x77},
    {0xe5, 0x1f},
    {0xd7, 0x03},
    {0xda, 0x10},
    {0xe0, 0x00},
};

const static uint8_t ov_rgb565_tbl[][2]= {
    {0xFF, 0x00},
    {0xDA, 0x09},
    {0xD7, 0x03},
    {0xDF, 0x02},
    {0x33, 0xa0},
    {0x3C, 0x00},
    {0xe1, 0x67},

    {0xff, 0x01},
    {0xe0, 0x00},
    {0xe1, 0x00},
    {0xe5, 0x00},
    {0xd7, 0x00},
    {0xda, 0x00},
    {0xe0, 0x00},
};

const static uint8_t ov_yuv422_tbl[][2]= {
    {0xFF, 0x00},
    {0xDA, 0x10},
    {0xD7, 0x03},
    {0xDF, 0x00},
    {0x33, 0x80},
    {0x3C, 0x40},
    {0xe1, 0x77},
    {0x00, 0x00},
};


const static uint8_t ov_auto_exposure_tbl[5][8]= {
    {
        0xFF, 0x01,
        0x24, 0x20,
        0x25, 0x18,
        0x26, 0x60,
    }, {
        0xFF, 0x01,
        0x24, 0x34,
        0x25, 0x1c,
        0x26, 0x00,
    }, {
        0xFF, 0x01,
        0x24, 0x3e,
        0x25, 0x38,
        0x26, 0x81,
    }, {
        0xFF, 0x01,
        0x24, 0x48,
        0x25, 0x40,
        0x26, 0x81,
    }, {
        0xFF, 0x01,
        0x24, 0x58,
        0x25, 0x50,
        0x26, 0x92,
    },
};

#endif
